package genetica.cromosomas.fenotipos.fenotipoPG;

import java.util.ArrayList;
import java.util.Stack;

public class Koza implements Cloneable {

	protected Stack<Bloque> pila;
	protected ArrayList<Bloque> mesa;
	protected static Bloque universal[] = { Bloque.U, Bloque.N, Bloque.I,
			Bloque.V, Bloque.E, Bloque.R, Bloque.S, Bloque.A, Bloque.L };

	public Koza() {
		pila = new Stack<Bloque>();
		mesa = new ArrayList<Bloque>();
	}

	//
	@SuppressWarnings("unchecked")
	public Koza(Stack<Bloque> pila, ArrayList<Bloque> mesa) {
		this.pila = (Stack<Bloque>) pila.clone();
		this.mesa = (ArrayList<Bloque>) mesa.clone();
	}

	public void addToMesa(char c) {
		if (c == 'U')
			mesa.add(Bloque.U);
		else if (c == 'N')
			mesa.add(Bloque.N);
		else if (c == 'I')
			mesa.add(Bloque.I);
		else if (c == 'V')
			mesa.add(Bloque.V);
		else if (c == 'E')
			mesa.add(Bloque.E);
		else if (c == 'R')
			mesa.add(Bloque.R);
		else if (c == 'S')
			mesa.add(Bloque.S);
		else if (c == 'A')
			mesa.add(Bloque.A);
		else if (c == 'L')
			mesa.add(Bloque.L);
	}

	public void addToPila(char c) {
		if (c == 'U')
			pila.push(Bloque.U);
		else if (c == 'N')
			pila.push(Bloque.N);
		else if (c == 'I')
			pila.push(Bloque.I);
		else if (c == 'V')
			pila.push(Bloque.V);
		else if (c == 'E')
			pila.push(Bloque.E);
		else if (c == 'R')
			pila.push(Bloque.R);
		else if (c == 'S')
			pila.push(Bloque.S);
		else if (c == 'A')
			pila.push(Bloque.A);
		else if (c == 'L')
			pila.push(Bloque.L);
	}

	@SuppressWarnings("unchecked")
	public Koza(Koza other) {
		// pila = new Stack<Bloque>();
		// mesa = new ArrayList<Bloque>();
		// // TODO chequear el orden
		// for (Bloque b : other.pila)
		// this.pila.add(b);
		// for (Bloque b : other.mesa){
		// this.mesa.add(b);
		// }
		this.pila = (Stack<Bloque>) other.pila.clone();
		this.mesa = (ArrayList<Bloque>) other.mesa.clone();
	}

	@Override
	public Koza clone() {
		return new Koza(this);
	}

	public boolean solucion() {
		if (pila.size() == universal.length){
			for (int i = 0; i < universal.length; i++) {
				if (!this.pila.get(i).equals(Koza.universal[i]))
					return false;
			}
			return true;
		}
		return false;
	}

	public String toString() {
		String cadena;
		cadena = "Mesa: ";
		for (int i = 0; i < mesa.size(); i++) {
			if (mesa.get(i) == Bloque.U)
				cadena += "U ";
			else if (mesa.get(i) == Bloque.N)
				cadena += "N ";
			else if (mesa.get(i) == Bloque.I)
				cadena += "I ";
			else if (mesa.get(i) == Bloque.V)
				cadena += "V ";
			else if (mesa.get(i) == Bloque.E)
				cadena += "E ";
			else if (mesa.get(i) == Bloque.R)
				cadena += "R ";
			else if (mesa.get(i) == Bloque.S)
				cadena += "S ";
			else if (mesa.get(i) == Bloque.A)
				cadena += "A ";
			else if (mesa.get(i) == Bloque.L)
				cadena += "L ";
		}
		cadena += ". Pila: ";
		for (int i = 0; i < pila.size(); i++) {
			if (pila.get(i) == Bloque.U)
				cadena += "U ";
			else if (pila.get(i) == Bloque.N)
				cadena += "N ";
			else if (pila.get(i) == Bloque.I)
				cadena += "I ";
			else if (pila.get(i) == Bloque.V)
				cadena += "V ";
			else if (pila.get(i) == Bloque.E)
				cadena += "E ";
			else if (pila.get(i) == Bloque.R)
				cadena += "R ";
			else if (pila.get(i) == Bloque.S)
				cadena += "S ";
			else if (pila.get(i) == Bloque.A)
				cadena += "A ";
			else if (pila.get(i) == Bloque.L)
				cadena += "L ";
		}
		return cadena;
	}

}
